[アップデート] Amazon RDS for PostgreSQLでpg_bigm拡張がサポートされました
しばたです。
少し前のはなしですが、Amazon RDS for PostgreSQLでpg_bigm拡張がサポートされ全文検索が容易に実行できる様になりました。
本記事ではこのアップデートについて簡単に解説します。
Amazon RDS for PostgreSQLでのpg_bigm拡張サポート
PostgreSQLではデータベースの拡張機能として全文検索を導入することが可能で、RDS for PostgreSQLではこれまで3-gram検索を行うpg_trgm
拡張がプレビュー機能として使用可能でしたが、今回は標準機能として2-gram検索を行うpg_bigm
拡張が追加されています。
ユーザーガイドによる更新情報を見ると、pg_bigm
拡張は既存の環境すべてというわけではなく現時点で最新マイナーアップデートから追加される形になっています。
- PostgreSQL 13 : PostgreSQL 13.2よりサポート
- PostgreSQL 12 : PostgreSQL 12.6よりサポート
- PostgreSQL 11 : PostgreSQL 11.11よりサポート
- PostgreSQL 10 : 非サポート
- PostgreSQL 9.x : 非サポート
追加されたpg_bigm
拡張のバージョンは現時点ではVer.1.2となっています。
こちらは将来的に随時更新されていくものと予想されます。
参考:PostgreSQL全般の全文検索について
PostgreSQLにおける全文検索の全般的な参考情報として以下のスライドを貼っておきます。
非常にわかりやすいので参考になると思います。
試してみた
それでは早速試してみます。
0. 検証環境
今回は東京リージョンにPostgreSQL 13.2の環境を作成し検証しました。
あらかじめ用意したVPC環境に「PostreSQL 13.2-R1」のRDSを作成します。
パラメーターグループはデフォルトのままでその他情報は環境に合わせてよしなに構築しています。
データベースへの接続にはpgAdminを使ってます。
1. pg_bigm拡張の確認
まずはRDS作成直後の状態で以下のSQLを実行し利用可能な拡張を検索してみました。
SELECT *
FROM pg_available_extensions
WHERE name IN ('pg_bigm', 'pg_trgm')
ORDER BY name;
プレビュー提供されているpg_trgm
Ver.1.5以外にpg_bigm
Ver.1.2が利用可能になっていることがわかります。
ちなみにひとつ前のマイナーバージョンであるPostgreSQL 13.1環境だと下図の様な結果となりpg_bigm
が利用できません。
(PostgreSQL 13.1環境で利用可能な拡張機能)
2. pg_bigm拡張の有効化
pg_bigm
を実際に使うには対象のデータベースで有効にする必要があります。
CREATE EXTENSION
文を実行して拡張を有効にします。
CREATE EXTENSION pg_bigm;
有効になった拡張は以下のSQLで確認できます。
SELECT * FROM pg_extension;
ここにpg_bigm
が出てくればOKです。
3. 全文検索を試す
ここからはpg_bigmのドキュメントにある例を使って全文検索を試してみます。
データベース内にテスト用のテーブルsample_pg_tools
を作りサンプルデータを投入します。
(ドキュメントではpg_tools
というテーブル名でしたが、システムビューと紛らわしいので名前をちょっと変えています)
CREATE TABLE sample_pg_tools (tool text, description text);
INSERT INTO sample_pg_tools VALUES ('pg_hint_plan', 'PostgreSQLでHINT句を使えるようにするツール');
INSERT INTO sample_pg_tools VALUES ('pg_dbms_stats', 'PostgreSQLの統計情報を固定化するツール');
INSERT INTO sample_pg_tools VALUES ('pg_bigm', 'PostgreSQLで2-gramの全文検索を使えるようにするツール');
INSERT INTO sample_pg_tools VALUES ('pg_trgm', 'PostgreSQLで3-gramの全文検索を使えるようにするツール');
作った結果はこんな感じ。
ここでdescription
列に全文検索インデックスを追加してやります。
CREATE INDEX sample_pg_tools_idx ON sample_pg_tools USING gin (description gin_bigm_ops);
作ったインデックスは以下のSQLで確認できます。
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'sample_pg_tools';
これで検索の準備が整いました。
pg_bigm
で全文検索するにはLIKE検索で%キーワード%
の様に中間一致検索してやればOKです。
SELECT * FROM pg_tools WHERE description LIKE '%全文%';
今回はデータが少ないので結果が分かりにくいですが、実行計画を確認して作成したインデックスでBitmap Index Scan
されていればOKです。
(※データ数が少ないとフルスキャンの方が効率的と判断されることがあります。今回はこちらの記事を参考に事前にちょっとデータの水増しをしています)
ちなみに、show_bigm
関数を使うと検索対象となる文字の配列を確認することができます。
今回の例だと、
SELECT show_bigm('PostgreSQLで2-gramの全文検索を使えるようにするツール');
と
"{うに,える,する,で2,にす,の全,よう,るよ,るツ,を使,ツー,""ル "",ール,使え,全文,文検,検索,索を,"" P"",-g,2-,Lで,Po,QL,SQ,am,eS,gr,mの,os,ra,re,st,tg}"
の様に二文字ずつに分解された文字列が検索に使われます。
最後に
以上となります。
単純に検索精度から見ると形態素解析の方が良いのかもしれませんが、導入と利用が非常にお手軽なpg_bigm
も使いどころは多いのではないかと思います。
必要に応じてぜひ利用してみてください。